package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import model.ItemOrdenCompra;
import model.OrdenCompra;

public abstract class APOrdenDeCompra {
	
	
	public static OrdenCompra buscarOrdenActiva(int idProveedor){
		Connection con = AdministradorConexiones.getInstancia().crearConexion();
		OrdenCompra orden = null;
		String sentence = "Select * from OrdenDeCompra where estado = 'Pendiente de envio' and idProveedor = ?";
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sentence);
			ps.setInt(1, idProveedor);
			ResultSet result = ps.executeQuery();
			while(result.next()){
				orden = new OrdenCompra(result.getInt("idOrdenDeCompra"),result.getDate("fecha"),result.getString("estado"), buscarItems(result.getInt("idOrdenDeCompra")), APProveedor.buscarProveedor(result.getInt("idProveedor"))); 
			}
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscar orden activas: " + e.getMessage());
			System.out.println("Stack Trace al buscar orden activas: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}		
		return orden;
	}
	
	public static OrdenCompra buscarOrdenEsperandoEntrega(int idProveedor){
		Connection con = AdministradorConexiones.getInstancia().crearConexion();
		OrdenCompra orden = null;
		String sentence = "Select * from OrdenDeCompra where estado = 'Esperando Entrega' and idProveedor = ?";
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sentence);
			ps.setInt(1, idProveedor);
			ResultSet result = ps.executeQuery();
			while(result.next()){
				orden = new OrdenCompra(result.getInt("idOrdenDeCompra"),result.getDate("fecha"),result.getString("estado"), buscarItems(result.getInt("idOrdenDeCompra")), APProveedor.buscarProveedor(result.getInt("idProveedor"))); 
			}
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscar orden activas: " + e.getMessage());
			System.out.println("Stack Trace al buscar orden activas: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}		
		return orden;
	}
	
	public static Vector<ItemOrdenCompra> buscarItems(int idOrdenCompra){
		
		Connection con = AdministradorConexiones.getInstancia().crearConexion();
		String sentence = "Select * from Material_OrdenDeCompra where idOrdenDeCompra = ?";
		Vector<ItemOrdenCompra> items = new Vector<ItemOrdenCompra>();
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sentence);
			ps.setInt(1, idOrdenCompra);
			ResultSet result = ps.executeQuery();
			//ACA
			while(result.next()){
				items.add(new ItemOrdenCompra(APMaterial.buscarMaterial(result.getInt("idMaterial")), result.getInt("cantidad")));
			}
		
			con.close();
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscarItems: " + e.getMessage());
			System.out.println("Stack Trace al buscarItems: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		
		
		return items;
	}

	public static void agregarItem(ItemOrdenCompra item) {
		Connection con = AdministradorConexiones.getInstancia().crearConexion();
		String sentence = "INSERT INTO Material_OrdenDeCompra VALUES (?,?,?)";
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sentence);
			ps.setInt(1, buscarOrdenActiva(item.getMaterial().getIdProveedor()).getNumero());			
			ps.setInt(2, item.getMaterial().getCodigo());
			ps.setInt(3, item.getCantidad());
			ps.execute();
			AdministradorConexiones.getInstancia().cerrarConexion(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al agregar Item a la orden: " + e.getMessage());
			System.out.println("Stack Trace al agregar Item a la orden: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		
	}

	public static void crearOrden(OrdenCompra orden) {
		Connection con = AdministradorConexiones.getInstancia().crearConexion();
		String sentence = "INSERT OrdenDeCompra (idProveedor, estado, fecha) VALUES (?,'Pendiente de envio',getdate())";
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sentence);
			ps.setInt(1, orden.getProveedor().getIdProveedor());
			ps.execute();
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		} catch (SQLException e) {
			System.out.println("Mensaje Error al crear orden: " + e.getMessage());
			System.out.println("Stack Trace al crear orden: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
	}
	
	public static void enviarOrden(OrdenCompra orden, float costo){
		Connection con = AdministradorConexiones.getInstancia().crearConexion();
		String sente  = "UPDATE OrdenDeCompra SET estado = ?, costo = ? where idOrdenDeCompra = ? ";
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sente);
			ps.setString(1, orden.getEstado());
			ps.setFloat(2, costo);
			ps.setInt(3, orden.getNumero());
			ps.execute();
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		} catch (SQLException e) {
			System.out.println("Mensaje Error al enviar orden: " + e.getMessage());
			System.out.println("Stack Trace al enviar orden: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
	}
		
		public static void cerrarOrden(OrdenCompra orden){
			Connection con = AdministradorConexiones.getInstancia().crearConexion();
			String sente  = "UPDATE OrdenDeCompra SET estado = ? where idOrdenDeCompra = ? ";
			PreparedStatement ps = null;
			try {
				ps = con.prepareStatement(sente);
				ps.setString(1, orden.getEstado());
				ps.setInt(2, orden.getNumero());
				ps.execute();
				AdministradorConexiones.getInstancia().cerrarConexion(con);
			} catch (SQLException e) {
				System.out.println("Mensaje Error al cerrar orden: " + e.getMessage());
				System.out.println("Stack Trace al cerrar orden: " + e.getStackTrace());
				AdministradorConexiones.getInstancia().cerrarConexion(con);
			}	
		
	}

}
